package common

import (
	//
	log "github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	"go-zookeeper-demo/app/helper"
	"os"
	"time"
)

func LogNew() {
	//log.AddHook(NewLineHooker())
	// 输出设备
	setOutput()

	//log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)

	// 输出格式
	setFormatter()

	// 日志等级
	setLevel()
}

func setOutput() {
	//创建输出日志文件
	logFilePath := "./logs/app-" + time.Now().Format("2006-01-02") + ".txt"

	// 若不存在，则创建 mkdir命令
	if !helper.FileExist("./logs") {
		if ok := os.MkdirAll("./logs", 0777); ok != nil {
			panic(ok)
		}
	}

	// 使用os.O_RDWR|os.O_APPEND|os.O_CREATE这种形式既可以创建文件，又可以追加，不用再去判断文件是否存在
	logFile, err := os.OpenFile(logFilePath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0777)
	if err != nil {
		log.Fatal(err)
	}

	// 根据配置，得到日志的输出位置
	output := viper.GetString("log.output")
	if output == "file" {
		// 设置标准输出的位置
		log.SetOutput(logFile)
	} else {
		log.SetOutput(os.Stderr)
	}
}
// 设置日志格式  可选的有json text
func setFormatter() {
	format := viper.GetString("log.format")
	if format == "json" {
		log.SetFormatter(&log.JSONFormatter{})
	} else {
		log.SetFormatter(&log.TextFormatter{})
	}
}

// log.Trace("Something very low level.")
// log.Debug("Useful debugging information.")
// log.Info("Something noteworthy happened!")
// log.Warn("You should probably take a look at this.")
// log.Error("Something failed but I'm not quitting.")
// Calls os.Exit(1) after logging
// log.Fatal("Bye.")
// Calls panic() after logging
// log.Panic("I'm bailing.")
func setLevel() {
	// 设置日志级别
	level := viper.GetString("log.level")
	switch level {
	case "panic":
		log.SetLevel(log.PanicLevel)
	case "fatal":
		log.SetLevel(log.FatalLevel)
	case "error":
		log.SetLevel(log.ErrorLevel)
	case "warn":
		log.SetLevel(log.WarnLevel)
	case "info":
		log.SetLevel(log.InfoLevel)
	case "debug":
		log.SetLevel(log.DebugLevel)
	case "trace":
		log.SetLevel(log.TraceLevel)
	}
}
//
//func newLfsHook(logLevel *string, maxRemainCnt uint) log.Hook {
//	writer, err := rotatelogs.New(
//		logName+".%Y%m%d%H",
//		// WithLinkName为最新的日志建立软连接，以方便随着找到当前日志文件
//		rotatelogs.WithLinkName(logName),
//
//		// WithRotationTime设置日志分割的时间，这里设置为一小时分割一次
//		rotatelogs.WithRotationTime(time.Hour),
//
//		// WithMaxAge和WithRotationCount二者只能设置一个，
//		// WithMaxAge设置文件清理前的最长保存时间，
//		// WithRotationCount设置文件清理前最多保存的个数。
//		//rotatelogs.WithMaxAge(time.Hour*24),
//		rotatelogs.WithRotationCount(maxRemainCnt),
//	)
//
//	if err != nil {
//		log.Errorf("config local file system for logger error: %v", err)
//	}
//
//	level, ok := logLevels[*logLevel]
//
//	if ok {
//		log.SetLevel(level)
//	} else {
//		log.SetLevel(log.WarnLevel)
//	}
//
//	lfsHook := lfshook.NewHook(lfshook.WriterMap{
//		log.DebugLevel: writer,
//		log.InfoLevel:  writer,
//		log.WarnLevel:  writer,
//		log.ErrorLevel: writer,
//		log.FatalLevel: writer,
//		log.PanicLevel: writer,
//	}, &log.TextFormatter{DisableColors: true})
//
//	return lfsHook
//}
